package com.zx._01_基础._015_编码技巧;

import com.zx.common.entity.User;
import com.zx.common.entity.User2;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.ImmutableTriple;
import org.junit.Test;

@Slf4j
public class 对象 {

    /**
     * 比较两个对象是否相等
     */
    @Test
    public void test01() {
        User user = new User();
        boolean equals = Objects.equals(user, user);
        log.info("u1 == u2 : {}", equals);
    }

    /**
     * 【重要】包装临时对象
     * 当一个方法需要返回两个及以上字段时，我们一般会封装成一个临时对象返回，现在有了Pair和Triple就不需要了
     */
    @Test
    public void test02() {
        // 返回两个字段
        ImmutablePair<Integer, String> pair = ImmutablePair.of(1, "yideng");
        log.info("left={}, right={}", pair.getLeft(), pair.getRight());// left=1, right=yideng

        // 返回三个字段
        ImmutableTriple<Integer, String, Date> triple = ImmutableTriple.of(1, "yideng", new Date());
        log.info("left={}, middle={}, right={}", triple.getLeft(), triple.getMiddle(), triple.getRight());
        // left=1, middle=yideng, right=Wed Aug 11 21:55:35 CST 2021
    }

    /**
     * 设置对象属性
     */
    @Test
    public void test03() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
        User2 user = new User2();
        BeanUtils.setProperty(user, "id", 1);
        BeanUtils.setProperty(user, "name", "yideng");
        System.out.println(user); // User [id=1, name=yideng, birtday=null]

        System.out.println(BeanUtils.getProperty(user, "name")); // yideng
        System.out.println(user); // User [id=1, name=yideng, birtday=null]
    }

    /**
     * 对象和map互转
     */
    @Test
    public void test04() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
        User2 user = new User2();
        user.setId(1);
        user.setName("yideng");

        // 对象转map
        Map<String, String> map = BeanUtils.describe(user);
        System.out.println(map); // 输出 {name=yideng, id=1, class=class com.zx.common.entity.User2, birtday=null}

        // map转对象[注意：这个地方如果有的类型为null，则会报错]
        User2 newUser = new User2();
        BeanUtils.populate(newUser, map);
        System.out.println(newUser); // 输出 {"id":1,"name":"yideng"}
    }

    /**
     * @title null 与 空 处理(JDK8)
     * @author: xue.zhang
     * @date 2019年2月15日下午8:35:57
     */
    @Test
    public void tes05() {
        // 可以为空，为空则创建新对象
        final User user = null;
        final User u1 = Optional.ofNullable(user).orElse(new User());
        System.out.println(u1);

        final User u2 = Optional.ofNullable(user).orElseGet(() -> new User());
        System.out.println(u2);

        final String str = null;
        final String orElse = Optional.ofNullable(str).orElse("");
        System.out.println(orElse);
    }

    /**
     * @Title: 使用级联(一种流式设计方式)
     * @date: 2019年2月15日下午10:42:25
     * @author: zhangxue
     */
    public void test06() {
		/* 优化前
			User user = new User();
			User.setId(1);
			User.setName(”ifeve“);
			User.setOld(7);
		*/
        // 优化后
        final User user = new User().setId(1L).setName("张三").setAge(18);
        System.out.println(user);
    }
}
